﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using Web.Models;
using Web.Repositories;

namespace Web.Controllers
{
    public class ReservaController : Controller
    {
        CategoriaRepository categoriaRepository = new CategoriaRepository();
        ReservaRepository reservaRepository = new ReservaRepository();
        //
        // GET: /Reserva/

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult ConsultarFechasDisponiblesView(bool error, string mensaje)
        {
            ViewBag.Mostrar = "hidden";
            if (error)
            {
                ViewBag.Error = mensaje;
                ViewBag.Mostrar = "visible";
            }
            return View();
        }

        public ActionResult ConsultarCategoriasDisponiblesView()
        {
            DateTime fechaIngreso = DateTime.Parse(Request["datFechaIn"]);
            DateTime fechaEgreso = DateTime.Parse(Request["datFechaOut"]);

            if (fechaIngreso >= fechaEgreso)
            {
                string mensajeError = "La fecha de ingreso no puede ser posterior a la fecha de egreso";
                return RedirectToAction("ConsultarFechasDisponiblesView", new { error = true, mensaje = mensajeError });
            }
            if (fechaIngreso < DateTime.Now)
            {
                string mensajeError = "La fecha de ingreso debe ser posterior a la fecha actual";
                return RedirectToAction("ConsultarFechasDisponiblesView", new { error = true, mensaje = mensajeError });
            }

            ViewBag.CategoriasDisponibles = categoriaRepository.getCategoriasDisponiblesEnRango(fechaIngreso, fechaEgreso);
            ViewBag.FechaIn = fechaIngreso;
            ViewBag.FechaOut = fechaEgreso;

            return View();
        }

        public ActionResult ConfirmarReserva(int idCategoria, DateTime fechaIn, DateTime fechaOut)
        {
            string Nombre = Request["txtNombre"];
            string Apellido = Request["txtApellido"];
            string Dni = Request["txtDNI"];
            string Email = Request["txtEmail"];
            string Telefono = Request["txtTelefono"];

            if (Nombre == string.Empty || Apellido == string.Empty || Dni == string.Empty || Email == string.Empty || Telefono == string.Empty || !Dni.All(char.IsDigit) || !EmailIsValid(Email))
            {
                string mensaje = "Hubo un problema procesando su solicitud. Por favor intentelo nuevamente mas tarde";
                string ret = Url.Action("ConsultarFechasDisponiblesView", "Reserva", new {error = false, mensaje = "" });
                return Redirect(Url.Action("Error", "Home", new { error = mensaje, volver = ret }));
            }

            Reserva reserva = new Reserva();
            reserva.FechaIngreso = fechaIn;
            reserva.FechaEgreso = fechaOut;
            reserva.Categoria = categoriaRepository.GetCategoria(idCategoria);

            Cliente cliente = new Cliente();

            cliente.Nombre = Nombre;
            cliente.Apellido = Apellido;
            cliente.Dni = Dni;
            cliente.Email = Email;
            cliente.Telefono = Telefono;

            reserva.Cliente = cliente;
            reservaRepository.AltaReserva(reserva);
            return RedirectToAction("ReservaView", new { idReserva = reserva.IdReserva });

        }

        public ActionResult ConfirmarReservaView(int idCategoria, DateTime fechaIn, DateTime fechaOut)
        {
            ViewBag.Categoria = categoriaRepository.GetCategoria(idCategoria);
            ViewBag.FechaIn = fechaIn;
            ViewBag.FechaOut = fechaOut;

            return View();
        }

        public ActionResult ReservaView(int idReserva)
        {
            var model = reservaRepository.GetReserva(idReserva);
            return View(model);
        }

        public ActionResult ModificarReservaView()
        {
            ViewBag.Error = false;
            if (Request.HttpMethod == "POST")
            {
                string codigoReserva = Request["txtCodigo"];

                Reserva reserva = reservaRepository.GetReserva(codigoReserva);
                if (reserva == null)
                {
                    ViewBag.Error = true;
                    ViewBag.ErrorMessage = "No se encontro ninguna reserva con ese código.";
                    return View();
                }
                if ((reserva.FechaIngreso - DateTime.Now).TotalHours <= 48)
                {
                    ViewBag.Error = true;
                    ViewBag.ErrorMessage = "Su reserva ya no puede ser modificada. Las reservas pueden ser modificas hasta 48 horas antes de su fecha de ingreso.";
                    return View();
                }
                var model = reserva;
                return View(model);
            }
            return View();
        }

        [HttpPost]
        public ActionResult ModificarReserva(int idReserva)
        {
            string Nombre = Request["txtNombre"];
            string Apellido = Request["txtApellido"];
            string Dni = Request["txtDNI"];
            string Email = Request["txtEmail"];
            string Telefono = Request["txtTelefono"];

            if (Nombre == string.Empty || Apellido == string.Empty || Dni == string.Empty || Email == string.Empty || Telefono == string.Empty || !Dni.All(char.IsDigit) || !EmailIsValid(Email))
            {
                string mensaje = "Hubo un problema procesando su solicitud. Por favor intentelo nuevamente mas tarde";
                string ret = Url.Action("ModificarReservaView", "Reserva");
                return Redirect(Url.Action("Error", "Home", new { error = mensaje, volver = ret }));
            }

            Reserva reserva = reservaRepository.GetReserva(idReserva);

            reserva.Cliente.Nombre = Nombre;
            reserva.Cliente.Apellido = Apellido;
            reserva.Cliente.Dni = Dni;
            reserva.Cliente.Email = Email;
            reserva.Cliente.Telefono = Telefono;

            reservaRepository.Save();
            return Redirect(Url.Action("ReservaView", new { idReserva = reserva.IdReserva }));
        }

        [HttpPost]
        public ActionResult EliminarReserva(int idReserva)
        {
            Reserva reserva = reservaRepository.GetReserva(idReserva);
            reservaRepository.EliminarReserva(reserva);
            return Redirect(Url.Action("Index", "Home"));
        }

        private bool EmailIsValid(string email)
        {
            string pattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
                            + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
                            + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

            Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
            return regex.IsMatch(email);
        }
    }
}
